package com.twq.patternmatch.patternusages

/**
 * Created by tangweiqun on 2017/12/9.
 * 模式在偏函数中的应用
 */
object PartialFunctions {
  def main(args: Array[String]): Unit = {
    //1、一个case序列作为全函数(complete function)
    val withDefault: Option[Int] => Int = {
      case Some(x) => x
      case None => 0
    }
    withDefault(Some(10))
    withDefault(None)

    //2、如果缺少了一个case会出现什么情况呢？
    //编译会出现警告
    val second: Option[Int] => Int = {
      case Some(x) => x
    }
    second(Some(1))
    second(None) //在运行的时候会抛异常 scala.MatchError: None

    //3、如果我们的case列表是部分的场景，我们需要告诉编译器这是一个偏函数(partial function)
    val partial: PartialFunction[Option[Int], Int] = {
      case Some(x) => x
    }
    partial(Some(1))

    //4、我们尽可能的用全函数，因为偏函数如果没有考虑清楚需要处理的case的话，可能会抛异常
    //如果我们确定没有考虑的case是不会出现的，那么我们可以用偏函数
    //我们也可以如下取调用一个偏函数
    if (partial.isDefinedAt(None)) {
      partial(None) //如果单独运行的话，还是会抛异常
    }

    //5、上面的partial就是和下面的p是一个意思
    val p = new PartialFunction[Option[Int], Int] {
      override def isDefinedAt(x: Option[Int]) = x match {
        case Some(_) => true
        case None => false
      }

      override def apply(v1: Option[Int]) = v1 match {
        case Some(x) => x
      }
    }

    val list = List(1, 2, 3, 4)
    list.collect {
      case 1 => 1 + 1
    }
  }
}
